package io.youngledo.usb.license;

import io.youngledo.usb.util.DialogUtils;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.*;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import javafx.scene.text.TextFlow;

/// 升级提示对话框
///
/// 当用户尝试使用专业版功能时，如果许可证不支持，显示此对话框。
/// 提供功能介绍和升级引导。
public class UpgradeDialog {

    /// 显示功能升级提示对话框
    ///
    /// @param feature 需要升级才能使用的功能
    public static void show(Feature feature) {
        var dialog = new Dialog<ButtonType>();
        dialog.setTitle("功能升级");
        dialog.setHeaderText(null);
        DialogUtils.applyFlatStyle(dialog);

        // 创建对话框内容
        var content = createContent(feature);
        dialog.getDialogPane().setContent(content);

        // 添加按钮
        var upgradeButton = new ButtonType("了解专业版", ButtonBar.ButtonData.OK_DONE);
        var cancelButton = new ButtonType("继续使用社区版", ButtonBar.ButtonData.CANCEL_CLOSE);
        dialog.getDialogPane().getButtonTypes().addAll(upgradeButton, cancelButton);

        // 显示对话框
        dialog.showAndWait();
    }

    /// 创建对话框内容
    private static VBox createContent(Feature feature) {
        var vbox = new VBox(15);
        vbox.setPadding(new Insets(20));
        vbox.setAlignment(Pos.TOP_LEFT);

        // 标题
        var titleText = new Text("需要升级到专业版\n\n");
        titleText.getStyleClass().add("title");

        // 功能描述
        var descText = new Text(String.format(
                "「%s」是专业版功能，需要 %s 许可证。\n\n",
                feature.getDisplayName(),
                feature.getRequiredLicense().getDisplayName()
        ));

        var textFlow = new TextFlow(titleText, descText);

        // 专业版功能列表
        var featuresLabel = new Label("专业版功能：");
        featuresLabel.getStyleClass().add("bold-text");

        var featuresText = new Label(getFeatureDescription());
        featuresText.getStyleClass().add("chinese-text");

        // 价格信息
        var priceLabel = new Label("\n定价：");

        var priceText = new Label("""
                专业版：¥29/买断版本（支持小版本问题修复）
                """);

        // 当前许可证信息
        var currentLicense = LicenseManager.getCurrentLicense();
        var currentInfo = new Label(String.format(
                "\n当前使用：%s",
                currentLicense.type().getDisplayName()
        ));
        currentInfo.getStyleClass().add("small-text");

        vbox.getChildren().addAll(
                textFlow,
                new Separator(),
                featuresLabel,
                featuresText,
                priceLabel,
                priceText,
                currentInfo
        );

        return vbox;
    }

    private static String getFeatureDescription() {
        return """
                ✅ 全存储支持 - 7种云存储服务
                ✅ 批量操作 - 多文件同时上传/下载
                ✅ 任务管理 - 完整的后台任务控制
                ✅ 无限连接 - 不受连接数限制
                ✅ 高级进度 - 速度和预估时间显示
                ✅ 更多功能 - 持续更新中...
                """;
    }

    /// 显示许可证信息对话框
    ///
    /// 显示当前许可证的详细信息
    public static void showLicenseInfo() {
        var dialog = new Dialog<ButtonType>();
        dialog.setTitle("许可证信息");
        dialog.setHeaderText(null);
        DialogUtils.applyFlatStyle(dialog);

        var license = LicenseManager.getCurrentLicense();
        var content = new VBox(15);
        content.setPadding(new Insets(20));
        content.setPrefWidth(450);

        // 许可证信息
        var infoText = new Label(license.getDisplayInfo());
        infoText.setWrapText(true);

        content.getChildren().add(infoText);

        // 如果是社区版，显示升级提示
        if (license.type() == LicenseType.COMMUNITY) {
            var upgradeHint = new Label("\n💡 升级到专业版以解锁更多功能");
            upgradeHint.getStyleClass().add("hint-text");
            content.getChildren().add(upgradeHint);
        }

        dialog.getDialogPane().setContent(content);
        dialog.getDialogPane().getButtonTypes().add(ButtonType.OK);

        dialog.showAndWait();
    }

    /// 显示专业版功能介绍对话框
    ///
    /// 不针对特定功能，纯展示专业版的所有功能和优势
    public static void showProFeatures() {
        var dialog = new Dialog<ButtonType>();
        dialog.setTitle("专业版功能");
        dialog.setHeaderText(null);
        DialogUtils.applyFlatStyle(dialog);

        var content = new VBox(15);
        content.setPadding(new Insets(20));
        content.setPrefWidth(500);

        // 标题
        var titleLabel = new Label("通用存储浏览器 - 专业版");
        titleLabel.getStyleClass().add("title");

        // 功能列表
        var featuresLabel = new Label("专业版功能：");
        featuresLabel.getStyleClass().add("bold-text");

        var featuresText = new Label(getFeatureDescription());
        featuresText.getStyleClass().add("chinese-text");

        // 价格信息
        var priceLabel = new Label("\n定价：");
        priceLabel.getStyleClass().add("bold-text");

        var priceText = new Label("¥19.9 / 买断永久使用（支持小版本更新）");

        // 当前状态
        var currentLicense = LicenseManager.getCurrentLicense();
        var currentInfo = new Label(String.format(
                "\n当前使用：%s",
                currentLicense.type().getDisplayName()
        ));
        currentInfo.getStyleClass().add("small-text");

        content.getChildren().addAll(
                titleLabel,
                new Separator(),
                featuresLabel,
                featuresText,
                priceLabel,
                priceText,
                currentInfo
        );

        dialog.getDialogPane().setContent(content);

        // 根据当前许可证状态显示不同按钮
        if (currentLicense.type() == LicenseType.COMMUNITY) {
            var activateButton = new ButtonType("激活许可证", ButtonBar.ButtonData.OK_DONE);
            var closeButton = new ButtonType("关闭", ButtonBar.ButtonData.CANCEL_CLOSE);
            dialog.getDialogPane().getButtonTypes().addAll(activateButton, closeButton);

            var result = dialog.showAndWait();
            if (result.isPresent() && result.get() == activateButton) {
                // 打开激活对话框
                LicenseActivationDialog.show();
            }
        } else {
            dialog.getDialogPane().getButtonTypes().add(ButtonType.OK);
            dialog.showAndWait();
        }
    }
}
